package request;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;
import java.util.Set;

/**
 * @author:zhengyilong
 * @email:1797344574@qq.com
 * @phone:13479394730
 * @desc:该类用于封装提供网络请求的功能代码，用于发起网络请求
 * 并将请求到的网络的数据进行返回
 * @DateTime:2021/12/6 16:32
 **/

/*
该函数用于实现get请求，并将请求的结果进行返回
参数  path    请求的资源路径
返回  请求的结果
 */
public class HttpUtil {

    public static String get(String path){
        InputStream inputStream = null;
        InputStreamReader inputStreamReader =null;
        BufferedReader reader = null;

        String line = "";//最开始空行
        String result = "";//每次读取到以后都要累计取来的读取结果
        try {
            //创建一个URL对象     URL，即Union Resource Location 统一资源定位
            URL url = new URL(path);
            //打开并获取到这个连接
            URLConnection conn = url.openConnection();
            //进行连接
            conn.connect();

            //从管道中拿到传回来的数据
            inputStream = conn.getInputStream();

            //字符流：按行读
            //将字节流数据转换成字符流数据
            inputStreamReader = new InputStreamReader(inputStream);
            reader = new BufferedReader(inputStreamReader);
            //reader.readLine() 每次读一行
            while ((line = reader.readLine()) != null){
                result += line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭读取流

                try {
                    if (reader != null){
                    reader.close();
                    }
                    if (inputStreamReader != null){
                        inputStreamReader.close();
                    }
                    if (inputStream != null){
                        inputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

        }
        return result;
    }

    /*
   封装的用java实现的原生post请求
   path:请求的路径
   header:请求头设置信息
   data:请求数据
    */
    public static String post(String path, Map<String,String> header, byte[] data){
        String result = "";     //result表示最后要返回的数据
        OutputStream outputStream = null;
        BufferedReader reader = null;
        //io:
        //输入流：字节输入流、字符读取流
        //输出流：字节输出流、字符写入流
        //字节字符转换流：
        try {
            URL url = new URL(path);
            //打开并获取到这个连接，强制类型转换成HttpURLConnection
            HttpURLConnection conn =(HttpURLConnection) url.openConnection();
            //设置请求类型
            conn.setRequestMethod("POST");
            //设置可以发送数据和接受数据
            conn.setDoInput(true);
            conn.setDoOutput(true);
            //设置请求头属性
            //ContentType:application/json
            //Authorization:"Basic "+nase64(用户信息)
            if (!header.isEmpty()){//header不为空
                //将header中的数据遍历，设置到请求头当中
                //如何拿到map中所有的key
                Set<String> keys = header.keySet();
                for (String key:keys){
                    String value = header.get(key);
                    conn.setRequestProperty(key,value);
                }
            }

            //把请求数据发送到请求的服务端
            outputStream = conn.getOutputStream();
            outputStream.write(data);
            outputStream.flush();//刷一下

            //等待接受返回的数据
            //将conn.getInputStream())字节流转换成字符流
            try {
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            }catch (Exception e){

            }

            String line = null;
            while ((line = reader.readLine()) != null){
                result += line;
            }

            //进行连接
            conn.connect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (reader!=null){
                    reader.close();
                }
                if (outputStream != null){
                    outputStream.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }

        return result;
    }

}

